<?php

/**
 * Maikuro Framework
 *
 * LICENSE:
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * The license is bundled with this package in the file LICENSE.txt.
 * You may also obtain a copy of the License at this URL:
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @copyright  Copyright (c) 2010, Jonathan Hedrén
 * @author     Jonathan Hedrén <jonathan.hedren@gmail.com>
 * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

spl_autoload_register('Autoloader::autoload');

/**
 * @see Validators
 */
require_once 'Validators.php';

final class AutoloaderException extends Exception {}

class Autoloader
{
    /**
     * The base directory to prepend to the class file path.
     *
     * @var string
     */
    protected static $baseDir;

    protected static $classSuffixesToPaths = array(
        'ViewController' => 'app/controllers/',
        'Form' => 'app/forms/',
        'ViewHelper' => 'app/view/helpers/',
        'ViewModel' => 'app/view/models/',
        'Mail' => 'app/mails/'
    );

    /**
     * Tuned autoload function.
     *
     * @return void
     */
    public static function autoload($className)
    {
        foreach (self::$classSuffixesToPaths as $ending => $path) {
            if (Validators::endsWith($className, $ending)) {
                $file = self::$baseDir . $path . $className . '.php';

                if (!file_exists($file)) {
                    throw new AutoloaderException('Could not autoload class "' . $className . '". "' . $file . '" not found.');
                }

                require_once $file;

                break;
            }
        }
    }

    /**
     *
     * @param string $suffix
     * @param string $path
     */
    public static function setClassSuffixToPath($suffix, $path)
    {
        self::$classSuffixesToPaths[$suffix] = $path;
    }


    /**
     * Sets the base dir.
     *
     * @param string $baseDir
     * @return void
     */
    public static function setBaseDir($baseDir)
    {
        self::$baseDir = $baseDir;
    }
}
